package com.charging.business.media;

import com.charging.business.utils.ToolsUtil;

/**
 * 卡片发行基本数据文件(DF01/0015)编码信息
 * 老卡43个字节
 * 新卡50个字节
 * @author lzj
 */
public class Card0015EdModel {
    public static final int MSG_LEN_1 = 43;
    public static final int MSG_LEN_2 = 50;

    /**
     * 发卡标识(01-08,8,cn)
     * 格式：AAAAAAAA + BBBB + CC + DD
     * AAAAAAAA：省级行政区划代码，2个汉字（4个字节）；
     * BBBB：运营商标识，压缩BCD码，河南为0x4101；
     * CC：保留；DD ：密钥分散标识，取值为 01。
     * 样例：0xBAD3C4CF41010001
     */
    public byte[] issueSign = new byte[8];

    /**
     * 卡片类型(09-09,1,n)22-储值卡；23-记账卡
     */
    public byte[] cardType = new byte[1];

    /**
     * 卡片版本(10-10,1,cn)统一为0x40
     */
    public byte[] cardVersion = new byte[1];

    /**
     * 卡片网络(11-12,2,cn)0x4101
     */
    public byte[] cardWork = new byte[2];

    /**
     * 卡片内部编号(13-20,8,cn)
     * 由1 字节“初始化年份”、1 字节“初始化星期”、1 字节“卡片类型”和5字节“卡片序列号”组成
     */
    public byte[] cardNo = new byte[8];

    /**
     * 启用时间(21-24,4,cn)
     * 格式:0xccyymmdd
     */
    public byte[] startTime = new byte[4];

    /**
     * 到期时间(25-28,4,cn)
     * 格式:0xccyymmdd
     */
    public byte[] endTime = new byte[4];

    /**
     * 车牌号码(29-40,12,an)
     */
    public byte[] plateNo = new byte[12];

    /**
     * 用户类型(41-41,1,n)
     * 0-普通车； 6-公务车； 8-军警车； 10-紧急车； 12-免费；14-车队； 0～20 内其他：自定义；
     * 21-绿通车； 22-联合收割机 ; 23-抢险救灾; 24－J1专用集装箱车；25-大件运输; 26－应急救援车；27－货车列车或半挂汽车列车;28-J2集装箱车
     */
    public byte[] vehicleUserType = new byte[1];

    /**
     * 车牌颜色(原自定义数据)(42-42,1,n)
     * 0x00 –蓝色； 0x01–黄色； 0x02 –黑色； 0x03 –白色； 0x04－渐变绿色； 0x05－黄绿双拼色； 0x06－蓝白渐变；0x07～ 0xFF 保留
     */
    public byte[] plateColor = new byte[1];

    /**
     * 车型(折扣率值)(43-43,1,n)
     * 1~4：客1~客4；11~16：货1~货6；21~26：专1~专6
     */
    public byte[] vehicleType = new byte[1];

    /**
     * 保留(44-50,7,an)
     */
    public byte[] spare = new byte[7];

    /**
     * 预解析
     *
     * @param strHex
     * @return
     */
    public static Card0015EdModel parse(String strHex) {
        if (strHex == null || strHex.isEmpty()) {
            return null;
        }

        // 老卡处理(老卡只有43字节,且车型及车牌颜色不定)
        if (strHex.length() == MSG_LEN_1 * 2) {
            strHex += "4F4C4443415244";
        }

//        if (strHex.length() < UCARD0015ED.MSG_LEN_2 * 2) {
//            return null;
//        }
        if (!ToolsUtil.chkHexChar(strHex)) {
            return null;
        }

        byte[] buff = ToolsUtil.hex2bin(strHex);
        return parseSelf(buff);
    }

    public static Card0015EdModel parseSelf(byte[] buff) {
        int index = 0;
        Card0015EdModel ret = new Card0015EdModel();
        index += ToolsUtil.arrcopy(buff, index, ret.issueSign);
        index += ToolsUtil.arrcopy(buff, index, ret.cardType);
        index += ToolsUtil.arrcopy(buff, index, ret.cardVersion);
        index += ToolsUtil.arrcopy(buff, index, ret.cardWork);
        index += ToolsUtil.arrcopy(buff, index, ret.cardNo);
        index += ToolsUtil.arrcopy(buff, index, ret.startTime);
        index += ToolsUtil.arrcopy(buff, index, ret.endTime);
        index += ToolsUtil.arrcopy(buff, index, ret.plateNo);
        index += ToolsUtil.arrcopy(buff, index, ret.vehicleUserType);
        index += ToolsUtil.arrcopy(buff, index, ret.plateColor);
        index += ToolsUtil.arrcopy(buff, index, ret.vehicleType);
        index += ToolsUtil.arrcopy(buff, index, ret.spare);

        // GBK车牌号码矫正
        chkVPlate(ret.plateNo);

        return ret;
    }

    public static boolean chkLen(String strHex) {
        if (strHex != null) {
            return strHex.length() == MSG_LEN_1 * 2 || strHex.length() == MSG_LEN_2 * 2;
        }
        return false;
    }

    /**
     * 信息解码
     *
     * @param obuVType   - 车型，为0时不设置车型及车牌颜色，维持原有信息不变
     * @param obuPlatClr - 车牌颜色
     * @return
     */
    public Card0015Model decoded(int obuVType, int obuPlatClr) {
        Card0015Model dd = new Card0015Model();
        dd.issueSign = ToolsUtil.bin2hex(issueSign);
        dd.cardType = ToolsUtil.bin2int(cardType);
        dd.cardVersion = ToolsUtil.bin2hex(cardVersion);
        dd.cardWork = ToolsUtil.bin2hex(cardWork);
        dd.cardNo = ToolsUtil.bin2hex(cardNo);
        dd.startTime = ToolsUtil.bin2hex(startTime);
        dd.endTime = ToolsUtil.bin2hex(endTime);
        dd.plateNo = ToolsUtil.bin2str(plateNo);
        dd.vehicleUserType = ToolsUtil.bin2int(vehicleUserType);
        dd.plateColor = ToolsUtil.bin2int(plateColor);
        dd.vehicleType = ToolsUtil.bin2int(vehicleType);
        dd.spare = ToolsUtil.bin2hex(spare);

        // ETC卡网络编号校正
        // 8个字符
        String issArea = dd.issueSign.substring(0, 8);
        // 2个字符
        String netWork = dd.cardWork.substring(0, 2);
        // 2个字符
        String subNet = dd.cardWork.substring(2);

        issArea = ToolsUtil.hex2str(issArea, "gb2312");
        if ("河南".equals(issArea)) {
            netWork = "41" + subNet;
        } else if ("上海".equals(issArea)) {
            netWork = "31" + subNet;
        } else if ("江苏".equals(issArea)) {
            netWork = "32" + subNet;
        } else if ("浙江".equals(issArea)) {
            netWork = "33" + subNet;
        } else if ("安徽".equals(issArea)) {
            netWork = "34" + subNet;
        } else if ("福建".equals(issArea)) {
            netWork = "35" + subNet;
        } else if ("江西".equals(issArea)) {
            netWork = "36" + subNet;
        } else if ("山东".equals(issArea)) {
            netWork = "37" + subNet;
        } else {
            netWork += subNet;
        }
        dd.cardNetId = netWork;

        // 不为普通，军警，J1集装箱，应急救援，挂车，J2集装箱
        if (dd.vehicleUserType != 0x00 && dd.vehicleUserType != 0x08 && dd.vehicleUserType != 0x18 && dd.vehicleUserType != 0x1A && dd.vehicleUserType != 0x1B && dd.vehicleUserType != 0x1C) {
            //强制转换为普通车
            dd.vehicleUserType = 0x00;
        }

        // 需要检查是否为老用户卡(长度不为50个字节的卡)
        if ((obuVType >= 1 && obuVType <= 4) || (obuVType >= 11 && obuVType <= 16) || (obuVType >= 21 && obuVType <= 26)) {
            //内容为"OLDCARD",parse(String strHex)时长度为43字节自动添加
            //内容为"oldcard",兼容处理(可能由前端添加)
            if ("4F4C4443415244".equals(dd.spare) || "6F6C6463617264".equals(dd.spare)) {
                // 为老版用户卡(0015文件长度为43个字节，第42、43字节为保留字节,42字节可能为车牌颜色,43字节可能为折扣率等 )
                dd.plateColor = obuPlatClr;
                dd.vehicleType = obuVType;
            }
        }

        return dd;
    }

    private static void chkVPlate(byte[] zb) {
        for (int aa = zb.length - 1; aa >= 0; aa--) {
            if (zb[aa] == (byte) 0xff) {
                zb[aa] = 0;
            } else {
                break;
            }
        }
    }
}
